#!/bin/bash
# ~/.bashrc
# Version     : 2.8.2
# Update-time : 2025-8-17
# Author      : BiaoZyx
# Email       : BiaoZyx@outlook.com

# 在交互shell启用bash自动补全，建议安装`bash-completion`并启用
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi
############################## 自定义 ##############################
## 变量
# 如果使用opkg，添加以下内容
#export PATH=$PATH:/opt/bin

# ----- 备忘录 -----
memo=/home/xue/文档/memo.xue

## 别名
alias ls="ls --color -F"      # 自定义`ls`，可自行删减
alias lah="ls -lah"  # 自定义`ls`，可自行删减
alias ll="ls -lh"    # 自定义`ls`，可自行删减
alias ip='ip --color=auto'    # `ip a`的彩色，很有必要

if [[ -z $memo ]]; then
    alias memo="echo 备忘录路径为空！请手动添加到~/.bashrc！"
else
    alias memo="lolcat $memo"
fi

alias irssi-rizon="irssi -c irc.rizon.net"    # 我的`irssi`快捷配置

alias d--="c++ -x cpp"

# `thefuck`配置，安装才加载
if [[ -e /usr/bin/thefuck ]]; then
    eval $( thefuck --alias f )
fi
####################################################################

# fish风格路径折叠
function _fish_collapsed_pwd() {
    local pwd="$1"
    local home="$HOME"
    local size=${#home}
    [[ $# == 0 ]] && pwd="$PWD"
    [[ -z "$pwd" ]] && return

    if [[ "$pwd" == "/" ]]; then
        echo "/"
        return
    elif [[ "$pwd" == "$home" ]]; then
        echo "~"
        return
    fi

    # 替换 $HOME 为 ~
    [[ "$pwd" == "$home/"* ]] && pwd="~${pwd:$size}"

    # 分割路径
    local IFS="/"
    local elements=($pwd)
    local length=${#elements[@]}

    for ((i=0; i<length-1; i++)); do  # 不处理最后一个元素
        local elem="${elements[$i]}"
        if [[ -n "$elem" ]]; then
            if [[ "$elem" == .* ]]; then
                # 隐藏文件夹（以 . 开头）显示前 2 个字符
                elements[$i]="${elem:0:2}"
            else
                # 普通文件夹显示第 1 个字符
                elements[$i]="${elem:0:1}"
            fi
        fi
    done

    # 重新组合路径
    IFS="/"
    echo "${elements[*]}"
}

# 颜色定义
RESET='\[\033[0m\]'
USER_COLOR='\[\033[1;34m\]'
HOST_COLOR='\[\033[1;33m\]'
PATH_COLOR='\[\033[1;36m\]'
GIT_COLOR='\[\033[1;32m\]'
TIME_COLOR='\[\033[0;35m\]'
SUCCESS_COLOR='\[\033[1;32m\]'
ERROR_COLOR='\[\033[1;31m\]'
PROMPT_COLOR='\[\033[1;37m\]'

# Root用户颜色
[[ $(id -u) -eq 0 ]] && USER_COLOR='\[\033[1;31m\]'

# Git分支检测
get_git_branch() {
    git branch 2>/dev/null | sed -n '/^\*/s/^\* //p' | awk '{print "|"$1}'
}

############################## 精准耗时提示符 ##############################

# 智能时间格式化
format_duration() {
    local ns=$1
    local ms=$(( (ns + 500000) / 1000000 ))  # 四舍五入到毫秒

    # 强制最小显示50ms（解决终端渲染误差）
    #(( ms < 50 )) && ms=50

    if (( ms >= 1000 )); then
            local sec=$(( ms / 1000 ))
            local remainder=$(( ms % 1000 ))
            if (( sec >= 60 )); then
                local min=$(( sec / 60 ))
                local sec_remain=$(( sec % 60 ))
                if ((min >= 60)); then
                    local hour=$((min / 60))
                    local min_remain=$((min % 60))
                    printf "(${TIME_COLOR}%dh %02dm %02d.%03ds${RESET})" $hour $min_remain $sec_remain $remainder
                else
                    printf "(${TIME_COLOR}%dm %02d.%03ds${RESET})" $min $sec_remain $remainder
                fi
            else
                printf "(${TIME_COLOR}%d.%03ds${RESET})" $sec $remainder
            fi
        else
            printf "(${TIME_COLOR}%dms${RESET})" $ms
        fi
    }

# 命令计时控制
__command_start_time=""
__last_prompt_time=""

trap '[[ -z "$__command_start_time" ]] && __command_start_time=$(date +%s%N)' DEBUG

set_accurate_prompt() {
    local last_status=$?
    local current_time=$(date +%s%N)

    # 计算耗时
    local duration_display=""
    if [[ -n "$__command_start_time" ]]; then
        local duration_ns=$((current_time - __command_start_time))
        duration_display=$(format_duration "$duration_ns")
        __command_start_time=""
    elif [[ -n "$__last_prompt_time" ]]; then
        local idle_ns=$((current_time - __last_prompt_time))
        duration_display=$(format_duration "$idle_ns")
    fi

    # 状态指示
    local status_indicator="${SUCCESS_COLOR}^o^"
    (( last_status != 0 )) && status_indicator="${ERROR_COLOR}>_<:$last_status"

    # 构建提示符
    PS1="╭─[${USER_COLOR}\u${RESET}@${HOST_COLOR}\h${RESET}:${PATH_COLOR}$(_fish_collapsed_pwd)${RESET}${GIT_COLOR}$(get_git_branch)${RESET}]—{${status_indicator}${RESET}}—(\t)—${duration_display}"
    PS1+="\n╰─${PROMPT_COLOR}\\\$${PATH_COLOR}>${RESET} "

    __last_prompt_time=$current_time
}

PROMPT_COMMAND+=("set_accurate_prompt")

# 欢迎界面
if [[ -e /usr/bin/figlet ]]; then
    figlet_lock_file="/tmp/figlet_lock_$$"
    # 使用 $$ 作为文件名的一部分，确保每个进程都有自己的锁文件
    # 检查锁文件是否存在
    if [ ! -f "$figlet_lock_file" ]; then
        # 创建锁文件并执行 figlet
        touch "$figlet_lock_file"
        echo "         _   _ _
/\\_/\\   | | | (_)
(o.o)   | |_| | |_
> ^ < . |  _  | ( )
/   \\ . |_| |_|_|/
"
        figlet "$USER! "
    fi
fi
trap 'rm -f "$figlet_lock_file"' EXIT TERM  # 用钩子，等退出删除锁文件